package uu.game.majiang.core;

/**
 * 代表一盘，就是从开始到有人和或黄庄的一盘
 * 
 * @author uu
 * @version 2010-4-21 下午02:16:37
 */
public final class Pan {
    
    /*
     * 此盘用的整幅牌，已洗过
     */
    private int[]          allPai = Pais.xipai();
    
    /*
     * 摸牌到第几张了(已摸的张数，从1开始)
     */
    private int            moNum;
    
    /*
     * 补牌到第几张了，杠牌或摸花后需要从后面补牌(已补到第几张，从144开始补).
     * TODO-没有象平常打的那样留出多少张牌来，不知道国标怎么规定的，好像国标不留牌
     */
    private int            buNum  = allPai.length - 0;
    
    /*
     * 所在的圈
     */
    private Quan           quan;
    
    /*
     * 和了的游戏者
     */
    private AbstractPlayer huPlayer;
    
    /*
     * 和了后的牌
     */
    private Pai            huPai;
    
    Pan(Quan quan) {
        this.quan = quan;
        
        AbstractPlayer[] players = quan.getJu().getPlayers();
        players[0].setPan(this);
        players[1].setPan(this);
        players[2].setPan(this);
        players[3].setPan(this);
        
        Feng quanfeng = quan.getQuanfeng();
        int[] pai1 = new int[13];
        int[] pai2 = new int[13];
        int[] pai3 = new int[13];
        int[] pai4 = new int[13];
        int i = 0;
        while (i < 13) {
            pai1[i] = fapai();
            pai2[i] = fapai();
            pai3[i] = fapai();
            pai4[i] = fapai();
            i++;
        }
        players[0].initPai(pai1, quanfeng);
        players[1].initPai(pai2, quanfeng);
        players[2].initPai(pai3, quanfeng);
        players[3].initPai(pai4, quanfeng);
    }
    
    /**
     * 所在的圈
     * 
     * @return 当前圈
     */
    public Quan getQuan() {
        return quan;
    }
    
    /**
     * 得到和了的游戏者
     * 
     * @return 和了的游戏者
     */
    public AbstractPlayer getHuPlayer() {
        return huPlayer;
    }
    
    /**
     * 得到和了的游戏者的牌
     * 
     * @return 和了的游戏者的牌
     */
    public Pai getHuPai() {
        return huPai;
    }
    
    /**
     * 是否已黄庄
     */
    public boolean isHuangzhuang() {
        return moNum + 1 >= buNum;
    }
    
    /**
     * 是否已结束。黄庄或有人和了就结束。
     */
    public boolean isFinished() {
        return isHuangzhuang() || huPlayer != null;
    }
    
    /*
     * 发牌
     */
    int fapai() {
        return allPai[moNum++];
    }
    
    /*
     * 补牌
     */
    int bupai() {
        return allPai[--buNum];
    }
    
    /*
     * 和了的游戏者
     */
    void setHuPlayer(AbstractPlayer player) {
        huPlayer = player;
    }
    
    /*
     * 和了的游戏者的牌
     */
    void setHuPai(Pai pai) {
        huPai = pai;
    }
    
    /*
     * 一盘结束时，释放包含大数组的对象引用。
     */
    void dispose() {
        allPai = null;
        for (AbstractPlayer p : quan.getJu().getPlayers())
            p.reset();
    }
}